package com.catazzz.springbootstudy.common.rabbit;

import com.rabbitmq.client.ConnectionFactory;
import org.springframework.amqp.core.AcknowledgeMode;
import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.listener.RabbitListenerContainerFactory;
import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @作者: Tao
 * @日期: 2025/1/13
 * @时间: 14:27
 * @描述: RabbitConfig 类用于配置 RabbitMQ 相关的 Bean <br><pre>
 */
//@Configuration
public class RabbitConfig {

    /**
     * 配置 RabbitMQ 监听器容器工厂
     *
     * @param connectionFactory RabbitMQ 连接工厂，用于创建与 RabbitMQ 服务器的连接
     * @return 返回配置好的 SimpleRabbitListenerContainerFactory 实例
     */
    @Bean
    public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(CachingConnectionFactory connectionFactory) {
        SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory);
        // 设置确认模式，默认为自动确认
        // AcknowledgeMode.AUTO - 自动确认模式，当消息被消费时，会自动确认消息的消费状态，即消息被消费后会被删除。
        // AcknowledgeMode.MANUAL - 手动确认模式，当消息被消费时，需要手动调用 channel.basicAck() 方法进行确认，否则消息会被重新放入队列。
        // AcknowledgeMode.NONE - 不进行确认，即不进行任何确认，消息会被直接丢弃。
        factory.setAcknowledgeMode(AcknowledgeMode.AUTO);
        // 设置默认的拒绝策略，当消息被拒绝时，true 将消息重新放入队列，false 表示直接丢弃
        factory.setDefaultRequeueRejected(true);
        // 设置预取数量， 0 表示不限制，即不进行预取，而是每次都从服务器获取一条消息
        factory.setPrefetchCount(0);
        return factory;
    }

    /**
     * 配置 RabbitMQ 连接工厂
     *
     * @return 返回配置好的 CachingConnectionFactory 实例
     */
    @Bean
    public CachingConnectionFactory connectionFactory() {
        CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
        // 设置 RabbitMQ 服务器地址、端口等信息
        connectionFactory.setHost("localhost");
        connectionFactory.setPort(5672);
        connectionFactory.setUsername("guest");
        connectionFactory.setPassword("guest");
        return connectionFactory;
    }
}
